//函数 我们一般也会标识类型 函数的参数和函数的返回值
//1function声明 2：表达式声明


//函数表达式（不必须标识）
//如果能自动推断出来的我们可以不用标识类型
type Sum = (c:string,d:string) => string;//类型别名 类型可以复用
let sum: Sum = function (a:string,b:string) {
    return a+b;
}

//ts 就是在代码使用时 会标识类型 方便提示
sum('a','b');
//给函数表达式标识类型 只用希望复制的类型满足这个类型 才会添加这个类型

//function函数只能标识参数类型和返回值类型
function sum1(a:string,b:string):string {
    return a+b;   
}

//函数的参数可以做一系列处理 可选参数 默认值，剩余运算符和js一样
function optional(a:string,b?:string,c?:string) {//可选运算符只能放在最后一个
}
optional('a');
function defaultVal(a:string,b:string='100') {//可选运算符只能放在最后一个
    
}
defaultVal('a');//如果不填默认是默认值

function spread(...arg:number[]) {
}
spread(1,2,3,4);

//用于标识函数类型中this是什么类型 不是传参
function callThis(this:string) {
    this
}
callThis.call(1,2);//对象标注类型 一般采用接口

//函数的重载
//给我一个字符串 -》 数组 'abc' =>['a','b','c'];
function toArray(val:string):string[] //对条件限制
function toArray(val: number): number[]
function toArray(val:string|number):string[]|number[] { //真实的实现 重载的实现中间不能添加其他语句
    if(typeof val =="string" ){
        return val.split('');
    }else{
        return val.toString().split('').map(item => Number(item))
    }
}
let arr = toArray(123)
let item = arr[0]
export {}